package cn.atzxc.qy.controller;

import cn.atzxc.qy.domain.Address;
import cn.atzxc.qy.domain.ResponseResult;
import cn.atzxc.qy.service.AddressService;
import cn.atzxc.qy.utils.JwtUtil;
import cn.atzxc.qy.utils.RedisCache;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 用户地址管理表
 *  增 删 改 查
 */
@RestController
@RequestMapping("/user/address")
public class AddressController {

    @Autowired
    private AddressService addressService;
    @Autowired
    private RedisCache redisCache;
    /**
     * 获取地址列表
     * 接收到前端的token 然后通过token解析出指定的用户名ID（user_id)
     * 通过 user_id 去查找指定的地址信息，并将查询到的所有地址信息存入到Redis中，以供后面修改时候获取
     */
    @GetMapping("/queryById")
    public ResponseResult getAddress(@RequestHeader("token") String authorizationHeader) throws Exception {
        System.out.println("进来了");
        //通过UserId获取到用户的地址信息
        List<Address> addressList = addressService.getAddressList(authorizationHeader);
        return new ResponseResult(200, "查询成功", addressList);
    }

    /**
     * 通过前端传递的token和地址ID可以进行删除操作
     * 通过地址ID获取到地址的数据
     * 然后把获取到的地址ID中的is_delete字段，设置为1，表示删除
     * @param authorizationHeader
     * @param addressid
     * @return
     * @throws Exception
     */
    @PostMapping("/deleteUserAddressById")
    public ResponseResult deleteAddress(@RequestHeader("token") String authorizationHeader,
                                        @RequestHeader("addressid") String addressid) throws Exception {

        //返回不等于0，或者等于1则表示删除成功
        int num = addressService.deleteAddressByAddressId(addressid);
        if (num > 0) {
            //通过token解析出指定的用户名ID
            Claims claims = JwtUtil.parseJWT(authorizationHeader);
            String subject = claims.getSubject();
            System.out.println("解析出的ID为："+subject);

            //已经更新完毕，重新查询一次数据
            //清空Redis
            redisCache.deleteObject("addresslist:" + subject);
            // 重新查询并设置redis
            List<Address> addressList = addressService.getAddressList(authorizationHeader);

            return new ResponseResult(200, "删除成功", addressList);
        } else {
            return new ResponseResult(400, "删除失败，没有指定的地址");
        }
    }

    /**
     * @param token token中带有userid
     * @param address
     * @return
     * @throws Exception
     */
    @PostMapping("/addAddress")
    public ResponseResult addAddress(@RequestHeader("token") String token,
                                     @RequestBody Address address) throws Exception {
        System.out.println("开始添加地址");
        System.out.println("对象：0"+address);
        int num = addressService.addAddress(token,address);
        if (num > 0) {
            Claims claims = JwtUtil.parseJWT(token);
            String subject = claims.getSubject();
            System.out.println("解析出的ID为："+subject);

            //已经更新完毕，重新查询一次数据
            //清空Redis
            redisCache.deleteObject("addresslist:" + subject);
            // 重新查询并设置redis
//            List<Address> addressList = addressService.getAddressList(token);
            //添加成功后，跳转到地址管理界面，会再次重新调用查询方法，所以不用设置查询
            return new ResponseResult(200, "添加成功");
        }else {
            return new ResponseResult(400, "添加失败");
        }

    }

    /**
     * 通过地址ID更新指定地址信息
     * @param token
     * @param address
     * @return
     * @throws Exception
     */
    @PostMapping("/updateAddressById")
    public ResponseResult update(@RequestHeader("token") String token, @RequestBody Address address) throws Exception {
        //更新操作
        System.out.println("开始更新操作");
        System.out.println(address);
        int num = addressService.updateAddressById(token, address);
        System.out.println("影响行数为："+num);
        if (num > 0) {
            //通过token解析出指定的用户名ID
            Claims claims = JwtUtil.parseJWT(token);
            String subject = claims.getSubject();
            System.out.println("解析出的ID为："+subject);

            //已经更新完毕，重新查询一次数据
            //清空Redis
            redisCache.deleteObject("addresslist:" + subject);
            // 重新查询并设置redis
            List<Address> addressList = addressService.getAddressList(token);

            return new ResponseResult(200, "修改成功", addressList);
        } else {
            return new ResponseResult(400, "修改失败，请重试");
        }
    }


    /**
     * 默认地址管理
     * @param token 可以根据token解析出当前登录的用户ID
     * @param address 可以根据地址ID获取到对应的地址的信息，并设置为默认地址
     * @return
     * @throws Exception
     */
    @PostMapping("/defaultAddress")
    public ResponseResult defaultAddress(@RequestHeader("token") String token,
                                         @RequestBody Address address) throws Exception {
        System.out.println("接收到的地址为："+address);
        int num = addressService.setDefaultAddress(token, address,new Date());
        if(num > 0){
            //通过token解析出指定的用户名ID
            Claims claims = JwtUtil.parseJWT(token);
            String subject = claims.getSubject();
            System.out.println("解析出的ID为："+subject);

            //已经更新完毕，重新查询一次数据
            //清空Redis
            redisCache.deleteObject("addresslist:" + subject);
            // 重新查询并设置redis
            List<Address> addressList = addressService.getAddressList(token);
            System.out.println("完成了默认地址设置");
            return new ResponseResult(200, "默认地址成功", addressList);
        }else {
            System.out.println("点击了指定的位置");
            return new ResponseResult(400, "设置默认地址失败");
        }


    }









}
